package main

import (
	"log"
	"os"
	"yuanfilesys/controller"
	"yuanfilesys/dao"
	"yuanfilesys/middleware"

	"github.com/gin-gonic/gin"
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
)

// 初始化文件系统服务，包括创建存储目录、连接数据库、迁移模型和创建管理员账户
func init() {
	// 创建数据存储目录
	if _, err := os.Stat("data"); os.IsNotExist(err) {
		os.Mkdir("data", 0755)
	}
	//创建数据库
	db, err := gorm.Open(sqlite.Open("filesystem.db"), &gorm.Config{})
	if err != nil {
		log.Fatalf("连接数据库失败: %v", err)
	}
	//连接到 SQLite 数据库文件 filesystem.db
	if err := db.AutoMigrate(&dao.User{}, &dao.FileNode{}); err != nil {
		log.Fatalf("模型迁移失败: %v", err)
	}
	//将初始化的数据库连接 db 赋值给 dao 包中的全局变量（如 dao.DB），供整个项目使用
	dao.SetDefault(db)
	// 初始化管理员账号
	if err := dao.InitAdminUser(); err != nil {
		log.Fatalf("初始化管理员账号失败: %v", err)
	}
}

func main() {
	//获取gin
	r := gin.Default()
	// 登录接口
	r.POST("/login", controller.Login)
	// 认证中间件
	authGroup := r.Group("/api")
	authGroup.Use(middleware.AuthMiddleware())
	// 用户管理接口
	authGroup.POST("/user", controller.CreateUser)
	// 文件操作接口
	// 文件操作接口组，基于 /api/file 路径
	fileGroup := authGroup.Group("/file")
	{
		// 创建文件夹
		// 示例: POST /api/file/0/new {"name": "新文件夹"}
		fileGroup.POST("/:file_id/new", controller.CreateFolder)
		// 上传文件
		// 示例: POST /api/file/5/upload (携带文件)
		fileGroup.POST("/:file_id/upload", controller.UploadFile)
		// 更新文件内容或元信息
		// 示例: POST /api/file/123/update {"name": "新文件名"}
		fileGroup.POST("/:file_id/update", controller.UpdateFile)
		// 删除文件或文件夹
		// 示例: DELETE /api/file/456
		fileGroup.DELETE("/:file_id", controller.DeleteFile)
		// 复制文件或文件夹
		// 示例: POST /api/file/789/copy?dest=10
		fileGroup.POST("/:file_id/copy", controller.CopyFile)
		// 移动文件或文件夹
		// 示例: POST /api/file/789/move?dest=10
		fileGroup.POST("/:file_id/move", controller.MoveFile)
		// 重命名文件或文件夹
		// 示例: POST /api/file/123/rename {"name": "新名称"}
		fileGroup.POST("/:file_id/rename", controller.RenameFile)
		// 获取文件或文件夹信息
		// 示例: GET /api/file/1231
		fileGroup.GET("/:file_id", controller.GetFileInfo)
		// 列出文件夹内容
		// 示例: GET /api/file/456/list
		fileGroup.GET("/:file_id/list", controller.ListFiles)
		// 下载文件内容
		// 示例: GET /api/file/123/content
		fileGroup.GET("/:file_id/content", controller.DownloadFile)
		// 下载文件的特定版本
		// 示例: GET /api/file/123/version/2/content
		fileGroup.GET("/:file_id/version/:ver_num/content", controller.DownloadFileVersion)
	}
	// 启动服务器
	if err := r.Run(":8080"); err != nil {
		log.Fatalf("启动服务器失败: %v", err)
	}
}
